{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "l对应 `tf.keras` 的01~02章节"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:38:09.583135Z",
     "start_time": "2025-02-25T15:37:54.374233Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "source": [
    "28*28"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:38:09.591473Z",
     "start_time": "2025-02-25T15:38:09.584137Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:48.703198Z",
     "start_time": "2025-02-25T15:41:48.646244Z"
    }
   },
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(), # 转换为tensor，进行归一化\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 34
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:26.894847Z",
     "start_time": "2025-02-25T15:41:26.888136Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  },
  {
   "cell_type": "code",
   "source": [
    "len(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:26.944116Z",
     "start_time": "2025-02-25T15:41:26.937081Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds[0])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:26.997251Z",
     "start_time": "2025-02-25T15:41:26.991532Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:53.779558Z",
     "start_time": "2025-02-25T15:41:53.773417Z"
    }
   },
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]\n",
    "img.shape\n",
    "# img.shape = (1, 28, 28)，这是因为通道数在最前面"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 28, 28])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 35
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:58.914151Z",
     "start_time": "2025-02-25T15:41:58.909095Z"
    }
   },
   "cell_type": "code",
   "source": "type(img) #tensor中文是 张量,和numpy的ndarray类似",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 36
  },
  {
   "cell_type": "code",
   "source": "img[0]",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:42:01.362724Z",
     "start_time": "2025-02-25T15:42:01.349221Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
       "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
       "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
       "         0.0118],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
       "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
       "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
       "         0.0588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
       "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
       "         0.2588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
       "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
       "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
       "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
       "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
       "         0.2039],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
       "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
       "         0.2196],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
       "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
       "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
       "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
       "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
       "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
       "         0.0000],\n",
       "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
       "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
       "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
       "         0.0000],\n",
       "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
       "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
       "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
       "         0.0000],\n",
       "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
       "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
       "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
       "         0.1137],\n",
       "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
       "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
       "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
       "         0.2627],\n",
       "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
       "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
       "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
       "         0.4510],\n",
       "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
       "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
       "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
       "         0.3608],\n",
       "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
       "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
       "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
       "         0.0000],\n",
       "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
       "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
       "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
       "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000]])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 37
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:27.357658Z",
     "start_time": "2025-02-25T15:41:27.346699Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACS0lEQVR4AWKgA2BkYOD1ZGBgZAHZxcjIAKZBbBBm+quS8v3rj1N/GBiZGP8wMKNIMv91cnnCzuU65+X/vww8/76hSP5iMFVgZtpp2HXm8nUz02PHGUHGQTHjf9cugd//GE7f+cUo8ft0yDSEJCMDw/8TCgyMf34x/Ph3/vYfT0VphLH/GRgY3kt+Z2fl+cH5z8aSSWwHqmsZuJiZvn18p/CPkYnr7z9ZBiaofQwMjMwMPFI/frH++sr/j537K9sldhOE5H9mhnBJJg4Gbtlf7L//cQhvusaCkGT5xXDlBxsXl6rSD2Yunr9PoraeYAGZx8T4+x/DHwaGbV+/s/1/zczxm+H3P2a9jwxMDMz///z6+Y+BwW7ime9v//z78/XrXw6GbwxsX4NAYc3AICSlJhmk/oPpN+czVjbhX1zHeOz+fWR9qcnIYNkkKvCX+cMfrl+M36+HneEVVGC4x/v5GycPHxcj83GpP3+/MTB/Z2DgF0lwy3z24/49VeFfrLxsf+UBY0xqv8vDw87Ayv/4mSiTRACHIrexMdMvJjYGRlYLlpeP+X485mHje/eQ5/uPP+svKwj9+vD77y/Wf4xsaixP/z/mFvnw5jULOysHL9Mbza+P37O/+f3nN6fERwOWC+sTn937wcPGwcb88+//by/+/WX5wfPrw4fffxRfMjIweBWLv/7wl5mNhZnxPysrGysjA+NLBrZ/EpfCGJn+MTA4tYnxMzGz/GV8+f/pvy/MDP9/f2Paff0YJBAYGBg0RN/LPPx1Fx5HFDIAaCTYdiCc4RIAAAAASUVORK5CYII=",
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q=="
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 25
  },
  {
   "cell_type": "code",
   "source": [
    "#计算均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds: # 遍历每张图片,img.shape=[1,28,28]\n",
    "        mean += img.mean(dim=(1, 2))\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:42:17.948900Z",
     "start_time": "2025-02-25T15:42:06.655888Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 38
  },
  {
   "cell_type": "code",
   "source": [
    "type(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:42:17.957501Z",
     "start_time": "2025-02-25T15:42:17.950898Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 39
  },
  {
   "cell_type": "code",
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:27.514785Z",
     "start_time": "2025-02-25T15:41:27.508716Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 28
  },
  {
   "cell_type": "code",
   "source": [
    "type(img) #tensor中文是 张量,和numpy的ndarray类似"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:27.633252Z",
     "start_time": "2025-02-25T15:41:27.628097Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 29
  },
  {
   "cell_type": "code",
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:27.663554Z",
     "start_time": "2025-02-25T15:41:27.657935Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 30
  },
  {
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L':\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(pixel_values)\n",
    "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:27.734009Z",
     "start_time": "2025-02-25T15:41:27.727387Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: (28, 28)\n",
      "图像模式: L\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
     ]
    }
   ],
   "execution_count": 31
  },
  {
   "cell_type": "code",
   "source": [
    "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_single_image(img_arr):\n",
    "    plt.imshow(img_arr, cmap=\"binary\") # 显示图片\n",
    "    plt.colorbar() # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "show_single_image(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:41:27.964810Z",
     "start_time": "2025-02-25T15:41:27.790453Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 32
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:33.231735Z",
     "start_time": "2025-02-25T15:45:32.436387Z"
    }
   },
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation = 'nearest')#interpolation='nearest'是临近插值\n",
    "            plt.axis('off')#去除坐标系\n",
    "            plt.title(class_names[label]) # 显示类别名称\n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb4tJREFUeJztnQe41FS3hoPSe++9SRekIwqCiDQFRRFFQBRRUcGG/Cr2hogoImDFgvyi0hEFFJCuFKnSm/TeBFGQuc/KvZP7ZZ3sMOdwymTme5/nwJ7Jnkxmt+ysmi4UCoUsQgghhJAAcklaXwAhhBBCSFLhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGCJqo1M9+7drezZs1+wXtOmTe2/5ELOVa1atWQ7H0ketm/fbqVLl8568803L1j3+eeft+uS6IH9R0jasj1O5uBFb2SGDx9u//j69esnzxXFGa+++qo1ceJEK4hIv0fyN2fOHCuaOH36tD1po+26Uhv2X+zx6aefuvouc+bMVtGiRa2WLVtaQ4cOtU6ePJnWl0gAzsHkIf3FnuDLL7+0Spcubf3666/W5s2brfLlyyfPlcXRRqZjx45W+/btraDxxRdfuF5//vnn1syZMxO8X7ly5RS/lmeeecbq379/xJPwhRdesMvJKdkLGuy/2OXFF1+0ypQpY509e9bat2+ffcPp27ev9dZbb1mTJ0+2atSokdaXSDgHo2Mjs23bNmvhwoXW+PHjrV69etmbmueeey75ro5ENV26dHG9Xrx4sT0J9fupQfr06e0/P86fP2/9888/qXZN0Q77L3Zp1aqVVadOHef1f/7zH2vWrFlW27ZtrRtuuMFat26dlSVLFs/Pnjp1ysqWLVsqXm38wjkYBaol2bjkyZPHatOmjS1VkNd+OroPPvjAKleunJUpUyarbt261pIlSy74HStWrLAKFChg7/r+/PNPY72///7b3kSJREjOX6JECatfv372+5GybNkyq1GjRvYEl6eZkSNHJqhz4MAB6+6777YKFSpki20vv/xy67PPPvNcDB577DH7OuR6LrvsMrsNMNm4tIvUk8+HRYhiJxQvLF261BZ558+f32nzHj16eNa90Njx0u/K6wcffNAel1WrVrU/K30q40mQJ4pwu8vnSeJg/wWLZs2aWQMGDLB27NhhjR492mWXuGXLFqt169ZWjhw5rDvuuMO5ab399tt228taJ2uePLAePXo00ePgq6++smrXrm2fP2fOnFb16tWtd955JxV/fWzCOZgMEhn5cTfddJOVMWNGq3PnztaIESPsxpFG0owZM8bWz8pEkB/9xhtv2J/dunWrlSFDBs/zy7mkk+TJYtKkScYnCJlw8pQxf/58695777XFcKtXr7aGDBlibdy4MSIbFJmcMpFvvfVW+7d8/fXX1v3332//tvDA+Ouvv+wNlajQpHNl0HzzzTf2YnDs2DGrT58+dj3ZrMj1zJ4929701KxZ05o+fbr1xBNPWLt377avSxDx4T333GPVq1fPvm5BBlo8IBvC6667zp4QIs7MnTu3vekV6V5yjJ0w8hQqfSn9JZNdNp4yTqVvO3ToYJ9HoKg9cbD/gsmdd95pPfXUU9aMGTOsnj172u+dO3fOXmcbN25sP2xlzZrVfl/6S2xu7rrrLuvhhx+2JfDDhg2zfvvtN2vBggV230UyDkTCIGtq8+bNrYEDB9rviURIzhFeM0ni4RwEQklk6dKlIloIzZw50359/vz5UPHixUN9+vRx1du2bZtdL1++fKEjR44470+aNMl+f8qUKc573bp1C2XLls0uz58/P5QzZ85QmzZtQmfOnHGds0mTJvZfmC+++CJ0ySWXhObNm+eqN3LkSPs7FixY4Ptb5FxSb/Dgwc57f//9d6hmzZqhggULhv755x/7vbffftuuN3r0aKeeHGvYsGEoe/bsoRMnTtjvTZw40a738ssvu76nY8eOoXTp0oU2b97svCe/V353LNC7d2/7d0fChAkT7LpLliwx1knM2HnuuecSfLe8lnGxdu1a1/sHDx60j8lnyP/D/gs+o0aNumC/5MqVK1SrVi27LGuP1O/fv7+rjqyl8v6XX37pev+HH35wvR/JOJB7gqzl586du8hfF/twDiaNSy5GGiOixmuuucZ+Lbu8Tp062SLEf//9N0F9OSZqqDBXXXWV/b/sCDUiyZAnBNnBy+5SxFl+iFREpDCVKlWyDh065PyJKDV8vgshukHZrYYRSYy8ll2vqJyEadOmWYULF7afLsLIblaeVkTt9fPPPzv1Lr30Uvt9RFRNMja+//57K96Rpwdh6tSptkGiH4kZO5omTZpYVapU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YOFGhhBCCCGBhRsZQgghhASWmN7IbN++3UqXLp315ptvXrDu888/b9clF0f37t2t7NmzX7Be06ZN7b/kQs5VrVq1ZDsfSV0+/fRTe/7JnE3KmCtdunSKXBeJDPZffNwno5U03chI40XyN2fOHCuaOH36tL3xibbrSirDhw+327l+/fppfSmB5NVXX7UmTpxoBY3Vq1dbHTt2tEqVKmVlzpzZKlasmNWiRQvr3XffTetLIxHA/gsO7KuUJb2VhnzxxReu159//rk1c+bMBO9Xrlw5xa/lmWeesfr37x/xRuaFF16wy8kpVUgrvvzyS/uJ6Ndff7U2b95slS9fPq0vKXAbGVmk2rdvbwWFhQsXWtdcc41VsmRJq2fPnlbhwoWtnTt3WosXL7beeecd66GHHkrrSyQ+sP+CA/sqxjcyXbp0cb2WjpWNjH4/NUifPr3958f58+etf/75x4oltm3bZk+08ePHW7169bI3Nc8991xaXxZJYV555RUrV65c1pIlS6zcuXO7jh04cCDNrotEBvsvOLCvLPvhP2vWrCl2/kDbyCxdutRq2bKllT9/fitLlixWmTJlrB49enjW/eCDD6xy5cpZmTJlsurWrWsPqgvZyMjrBx980L65V61a1f7syJEjrQIFCtjHRSoTVn/J54OI/LY8efJYbdq0saUK8tpPh3qhdvRixYoVdpuJ9OrPP/801vv777/tTZRIhOT8JUqUsPr162e/HynLli2zGjVq5IwH6S+NLB533323VahQIVvMe/nll1ufffZZgnqnTp2yHnvsMfs65Houu+wyuw1CoZBTR9pF6snnw2NBdP7RzpYtW+wxrRdWoWDBgk551KhRVrNmzez3pA2qVKlijRgxIsFnRKLXtm1ba/78+Va9evXsdi1btqwtZdWsXbvWPqf0UfHixa2XX37ZfkjQTJo0yR6XRYsWtb9bxt1LL71k/fvvv1a8w/6Lvb4K329ETS32ftJm8rkffvghwed2795t3+tkDcv0f/U++eQTVx156H722Wet2rVr2xupbNmyWVdddZU1e/bsC16zrHH33nuvlTFjRvshN8zo0aPt80nf582b17rtttts6ZKXvaKsxVdffbW9gXnqqaesmJXIXAxyM7ruuuvsG6SohGSQyA0XGz3MmDFjrJMnT9oSBxksb7zxhnXTTTdZW7dutTJkyOD7PbNm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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 40
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.201087Z",
     "start_time": "2025-02-25T15:45:42.195714Z"
    }
   },
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批，shuffle洗牌\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "outputs": [],
   "execution_count": 41
  },
  {
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.329456Z",
     "start_time": "2025-02-25T15:45:42.321623Z"
    }
   },
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(300, 100),#隐藏层神经元数100\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(100, 10),#输出层神经元数10\n",
    "        )\n",
    "\n",
    "    def forward(self, x): # 前向计算\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits #没有经过softmax,称为logits\n",
    "    \n",
    "model = NeuralNetwork()"
   ],
   "outputs": [],
   "execution_count": 42
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.348732Z",
     "start_time": "2025-02-25T15:45:42.342530Z"
    }
   },
   "source": [
    "# 看看网络结构\n",
    "model"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 43
  },
  {
   "cell_type": "code",
   "source": [
    "784*300+300+300*100+100+100*10+10"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.417581Z",
     "start_time": "2025-02-25T15:45:42.411294Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "266610"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 44
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.440513Z",
     "start_time": "2025-02-25T15:45:42.433732Z"
    }
   },
   "source": [
    "for name, param in model.named_parameters(): # 打印模型参数\n",
    "      print(name, param.shape)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 45
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.539206Z",
     "start_time": "2025-02-25T15:45:42.510526Z"
    }
   },
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[ 0.0242, -0.0218,  0.0344,  ...,  0.0222, -0.0170,  0.0135],\n",
       "         [-0.0357,  0.0259, -0.0301,  ...,  0.0203, -0.0070, -0.0075],\n",
       "         [ 0.0176, -0.0125,  0.0112,  ..., -0.0260,  0.0250,  0.0058],\n",
       "         ...,\n",
       "         [ 0.0117, -0.0124, -0.0135,  ..., -0.0295, -0.0020, -0.0080],\n",
       "         [ 0.0292,  0.0198, -0.0154,  ...,  0.0174,  0.0246,  0.0022],\n",
       "         [ 0.0206, -0.0006,  0.0112,  ..., -0.0302, -0.0265, -0.0090]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-3.5370e-02,  2.9772e-02, -6.7854e-03, -2.1672e-02, -3.4746e-02,\n",
       "         -2.3725e-02, -2.1409e-02, -3.1503e-02,  1.1405e-02, -7.3524e-03,\n",
       "         -2.7979e-02, -8.4015e-03, -2.5097e-02,  3.3520e-02, -3.2565e-02,\n",
       "         -1.0813e-02, -1.4766e-02,  2.2390e-02, -8.7864e-03,  1.1155e-02,\n",
       "         -1.5961e-02, -1.7762e-02,  5.5499e-03,  1.2505e-02, -1.7416e-02,\n",
       "          9.7545e-03, -4.2967e-05,  9.8293e-03,  3.4142e-02,  3.1664e-02,\n",
       "         -3.4830e-02,  2.2349e-02, -4.4650e-03,  4.0551e-03,  1.0069e-02,\n",
       "         -1.8257e-02,  2.0048e-02,  1.3605e-02, -3.5248e-02, -2.9638e-03,\n",
       "         -1.2392e-02,  2.7045e-02,  2.8470e-02, -7.3843e-05,  2.7582e-03,\n",
       "          2.7122e-02, -2.0147e-02, -1.1217e-02, -1.2242e-02, -2.9818e-02,\n",
       "         -2.7414e-02,  3.4907e-02,  3.2412e-02,  2.7067e-02,  3.4308e-02,\n",
       "          1.9556e-02, -3.4114e-02, -1.5681e-02, -2.5378e-02, -1.8982e-02,\n",
       "          1.8642e-02,  1.9927e-02, -7.0416e-04, -2.5443e-02, -2.3017e-02,\n",
       "          2.8500e-02, -1.1822e-02, -9.9642e-03,  2.8824e-02, -1.7805e-02,\n",
       "         -3.5520e-02,  6.2808e-03,  2.0306e-02, -1.1785e-02,  7.4269e-03,\n",
       "         -3.4826e-02,  8.2477e-03,  1.1611e-02,  2.0115e-02,  9.2261e-04,\n",
       "          3.4497e-02, -2.1558e-02, -1.0002e-02,  2.1380e-03,  2.1656e-02,\n",
       "         -3.1935e-03, -5.4049e-03,  1.7134e-02, -1.6539e-02,  3.1849e-02,\n",
       "         -6.2702e-03, -3.4029e-02, -1.9390e-02, -2.9394e-02,  5.4919e-03,\n",
       "         -5.5506e-03,  2.7282e-02,  1.6048e-02,  2.6572e-02, -2.6394e-02,\n",
       "          6.4381e-03,  3.2717e-02,  2.9065e-02,  1.9638e-02, -1.9123e-02,\n",
       "         -1.4904e-02,  1.7764e-02, -1.3099e-02,  5.4867e-03,  6.4057e-03,\n",
       "         -1.2193e-02, -1.8311e-02, -1.2193e-02,  2.4960e-02, -2.7594e-02,\n",
       "          3.3433e-02,  3.0360e-02,  8.4824e-03, -2.4001e-03,  1.9847e-02,\n",
       "          1.2479e-02,  2.0983e-02, -1.8254e-02, -2.6736e-02,  2.2072e-02,\n",
       "          2.6616e-02, -1.9991e-02, -9.4874e-03,  2.7736e-02, -2.8907e-02,\n",
       "         -8.5135e-03,  4.8305e-04,  1.6782e-02,  2.6254e-02,  4.9814e-03,\n",
       "          1.5192e-02, -2.1815e-02,  9.5378e-04,  1.1898e-02, -3.7573e-03,\n",
       "         -2.4085e-02,  1.1148e-02,  2.4191e-02, -3.2445e-02, -7.5646e-03,\n",
       "         -2.3529e-02,  4.1912e-03, -2.4747e-02,  1.0494e-02, -9.6690e-03,\n",
       "          2.3830e-02, -1.9982e-02, -3.2412e-02,  2.4928e-02, -2.9013e-02,\n",
       "         -3.2188e-02,  2.9478e-02,  1.9996e-02,  6.0650e-03,  3.4650e-02,\n",
       "         -1.9346e-02,  3.1185e-02, -1.1112e-02, -1.7411e-02, -3.3070e-02,\n",
       "         -2.0441e-02,  1.9855e-02, -3.0929e-02, -1.5059e-02, -2.3578e-03,\n",
       "         -2.8452e-02, -4.2537e-03,  1.9574e-02,  1.6756e-03, -2.2443e-02,\n",
       "         -3.4327e-02,  2.5250e-02, -1.1326e-03, -4.6641e-03,  6.5555e-03,\n",
       "         -1.9269e-02,  1.6977e-02, -7.1892e-03, -3.1713e-02, -2.0756e-02,\n",
       "         -2.5773e-03, -1.1078e-02, -2.5770e-03,  5.7121e-03, -2.6859e-02,\n",
       "         -1.7403e-02, -2.1806e-02, -2.0753e-03, -1.8625e-02,  1.0954e-02,\n",
       "          1.4479e-03,  1.0469e-02, -1.1413e-02,  5.2014e-04,  2.5399e-02,\n",
       "         -2.9679e-02,  2.3392e-02, -8.3611e-03, -1.6703e-02, -1.3253e-02,\n",
       "          4.5116e-03, -2.2202e-02,  3.1743e-02, -2.7279e-02, -2.7205e-02,\n",
       "          2.7321e-02, -3.2495e-04, -2.8756e-02, -1.2419e-02,  4.8981e-03,\n",
       "          1.3850e-02, -5.5068e-03, -2.1937e-02, -6.4817e-03,  2.0671e-02,\n",
       "         -8.8941e-03,  3.2471e-02,  1.4578e-02, -1.3314e-02, -2.3994e-02,\n",
       "          2.5496e-02,  1.7188e-02,  3.4785e-04, -1.9481e-02,  8.6012e-03,\n",
       "         -5.8615e-03,  1.3470e-02,  2.1086e-02, -2.2890e-02,  2.0374e-02,\n",
       "          2.4321e-02,  1.4192e-02,  3.1044e-02, -3.4189e-02,  3.0420e-02,\n",
       "         -1.1961e-02, -1.4208e-02,  5.6269e-03,  3.0687e-02,  1.0412e-02,\n",
       "         -3.5482e-02, -3.1913e-02, -2.0822e-02, -3.5133e-02, -8.8200e-04,\n",
       "         -1.5389e-02, -1.5520e-02, -1.4822e-02,  2.4511e-02,  2.4563e-02,\n",
       "         -9.9610e-03, -2.8747e-02,  1.0093e-02, -2.4589e-02,  2.9499e-02,\n",
       "          2.6716e-02,  9.0978e-04,  4.5489e-03, -1.3019e-02,  7.6562e-03,\n",
       "          4.7971e-03,  3.5453e-02,  3.2321e-02,  1.2541e-02, -3.0127e-02,\n",
       "          3.1700e-02, -1.6657e-03,  8.5490e-03, -5.1536e-03, -2.9874e-02,\n",
       "         -2.5155e-02,  2.2455e-02,  1.3867e-02, -2.5200e-02,  5.7309e-03,\n",
       "          2.3115e-02,  1.7800e-02, -8.3430e-03,  1.2373e-02,  1.8076e-02,\n",
       "         -3.4720e-02, -5.2791e-03, -2.6794e-02, -2.3779e-02, -6.0884e-03,\n",
       "          5.3257e-03,  7.4207e-03,  2.3290e-02, -1.9986e-02,  9.4280e-03,\n",
       "          6.6240e-03, -2.1371e-02,  1.1320e-03,  2.5810e-03,  1.7438e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 0.0083, -0.0006, -0.0383,  ...,  0.0158,  0.0045, -0.0427],\n",
       "         [-0.0464,  0.0043, -0.0364,  ..., -0.0289, -0.0252, -0.0373],\n",
       "         [ 0.0429,  0.0002, -0.0298,  ...,  0.0334, -0.0156,  0.0550],\n",
       "         ...,\n",
       "         [ 0.0234, -0.0502,  0.0465,  ..., -0.0487,  0.0220,  0.0376],\n",
       "         [ 0.0223,  0.0235, -0.0440,  ..., -0.0497,  0.0314,  0.0445],\n",
       "         [ 0.0082,  0.0488, -0.0030,  ...,  0.0055,  0.0164, -0.0458]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0371,  0.0219,  0.0507,  0.0142,  0.0316,  0.0256,  0.0237,  0.0288,\n",
       "          0.0563,  0.0142, -0.0239, -0.0123,  0.0483,  0.0151, -0.0308, -0.0416,\n",
       "         -0.0178,  0.0291, -0.0078, -0.0323, -0.0173, -0.0044, -0.0054, -0.0405,\n",
       "          0.0170, -0.0141, -0.0284, -0.0468,  0.0207,  0.0399,  0.0533, -0.0097,\n",
       "         -0.0360, -0.0531,  0.0282, -0.0564, -0.0472,  0.0453, -0.0064,  0.0048,\n",
       "         -0.0547,  0.0563, -0.0510, -0.0098, -0.0286,  0.0532,  0.0153,  0.0114,\n",
       "         -0.0411,  0.0314,  0.0015, -0.0319,  0.0335,  0.0378,  0.0384,  0.0340,\n",
       "         -0.0067,  0.0436,  0.0093,  0.0339,  0.0078,  0.0240,  0.0489, -0.0488,\n",
       "         -0.0259, -0.0531, -0.0057, -0.0394, -0.0480, -0.0335,  0.0269,  0.0303,\n",
       "         -0.0481,  0.0291,  0.0103, -0.0117,  0.0237, -0.0090,  0.0103, -0.0208,\n",
       "          0.0566,  0.0082, -0.0231,  0.0021, -0.0006,  0.0551, -0.0353, -0.0058,\n",
       "         -0.0131,  0.0402,  0.0166, -0.0020, -0.0411,  0.0532,  0.0103,  0.0168,\n",
       "         -0.0279, -0.0233, -0.0571, -0.0107], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 9.2728e-02,  6.7423e-02, -8.8966e-03, -3.1287e-02,  4.3157e-02,\n",
       "          -7.1507e-02, -1.6418e-02, -3.5287e-02, -1.0734e-02, -7.5620e-02,\n",
       "           6.6269e-02, -6.4546e-02,  3.0702e-02, -6.4818e-03,  8.0608e-02,\n",
       "          -1.9461e-02, -2.1235e-02, -5.9128e-02,  8.2499e-02, -7.3884e-02,\n",
       "          -8.1222e-02,  1.1691e-04,  2.6428e-02, -5.6373e-02, -4.8922e-03,\n",
       "           5.8535e-02,  8.5162e-02,  1.5547e-02,  1.0449e-02,  6.0624e-02,\n",
       "          -9.8548e-02,  2.6557e-02,  8.0580e-02, -6.7324e-02,  8.9435e-02,\n",
       "           6.7778e-03,  1.4716e-02,  3.0932e-02,  1.8360e-02, -7.3175e-02,\n",
       "           8.2749e-03,  5.1477e-02,  3.5175e-02, -9.2086e-02,  5.5861e-02,\n",
       "           2.5405e-02, -2.2185e-02, -8.1767e-02, -6.4158e-02,  1.4278e-02,\n",
       "          -2.1199e-02,  3.7509e-02, -9.1123e-02, -4.1339e-02,  9.3559e-02,\n",
       "           3.4658e-02,  4.1394e-02, -1.4137e-02, -8.1354e-02,  8.1708e-02,\n",
       "          -7.4249e-02,  6.4988e-02,  8.8536e-02, -5.5656e-02, -9.3574e-02,\n",
       "           4.3175e-02,  5.1126e-02,  8.6811e-03,  9.7328e-02, -2.2146e-02,\n",
       "           8.8052e-02, -7.7049e-02, -3.9358e-02, -8.9733e-02, -8.0699e-02,\n",
       "          -1.2508e-02,  1.1296e-02, -9.3094e-02, -1.9303e-02,  8.1046e-02,\n",
       "           3.8087e-02,  7.8984e-02, -6.5468e-02, -6.9976e-02,  8.9662e-02,\n",
       "          -8.9283e-02,  6.7066e-02,  9.4440e-02, -2.1484e-04,  8.9895e-02,\n",
       "          -6.8483e-03, -3.5254e-02, -6.8181e-02,  7.6468e-02,  5.6297e-02,\n",
       "          -9.6841e-03, -1.9943e-02, -3.0431e-02, -2.5137e-03, -5.5773e-02],\n",
       "         [-4.4319e-02, -6.9650e-02,  9.4539e-02, -1.5839e-02,  7.4159e-02,\n",
       "          -9.9506e-02,  5.9713e-02,  3.3249e-02, -3.3046e-02,  2.6358e-02,\n",
       "           5.8219e-02,  4.6444e-02,  4.8706e-02,  4.2719e-02, -5.8652e-02,\n",
       "           5.5908e-02, -6.8858e-02,  9.8180e-02, -6.1796e-02, -5.4271e-02,\n",
       "           1.8313e-02,  9.0531e-02,  7.0202e-03,  1.5748e-02,  4.1250e-02,\n",
       "          -8.1870e-02, -6.7588e-04,  3.6331e-02,  5.3793e-02, -2.9051e-02,\n",
       "           6.5937e-02, -5.8074e-02,  3.3194e-02,  3.2114e-02, -5.5307e-02,\n",
       "           8.5705e-02,  7.7160e-02,  9.7827e-02, -4.4382e-02,  6.9900e-02,\n",
       "          -7.1380e-02, -7.5530e-02, -3.2164e-02, -7.3020e-02,  2.1601e-02,\n",
       "          -3.3151e-02, -5.1340e-02,  6.6530e-03, -8.4228e-03,  7.5876e-02,\n",
       "           4.7286e-02,  2.7779e-02,  2.5011e-02, -1.8001e-02,  2.8212e-02,\n",
       "          -7.8509e-02, -8.5062e-02,  4.2862e-02,  5.8695e-03, -9.7002e-02,\n",
       "          -9.7432e-02,  6.3554e-02, -4.8109e-02, -2.0056e-02, -2.7729e-02,\n",
       "           8.6605e-02,  2.6679e-02, -6.4887e-02, -1.6045e-02, -6.0252e-02,\n",
       "           5.4559e-02,  6.3617e-02,  2.1801e-02,  7.1044e-02, -7.5727e-02,\n",
       "           1.5842e-02, -4.3031e-02, -2.6151e-02,  8.3719e-02,  9.7462e-02,\n",
       "           6.2555e-02,  6.1407e-02,  4.3768e-02, -3.5419e-02, -3.8000e-02,\n",
       "           2.7647e-02, -3.6712e-02,  7.2557e-02,  6.8762e-02,  9.1359e-02,\n",
       "          -8.8876e-02, -6.4153e-02,  8.9157e-02,  3.0403e-02,  3.8466e-02,\n",
       "          -8.7553e-02,  6.6967e-02, -9.9057e-02,  3.2535e-02,  7.5042e-03],\n",
       "         [ 1.7178e-02,  7.6868e-02,  5.6546e-02, -9.9907e-02,  1.1258e-02,\n",
       "          -3.9421e-02, -8.1211e-02, -3.8693e-02,  3.8947e-02,  5.5713e-02,\n",
       "          -7.8071e-02,  6.9930e-02,  7.0196e-02, -2.1063e-02, -7.6283e-02,\n",
       "          -1.0177e-02,  1.3519e-02, -9.8825e-03,  9.1513e-02,  1.0363e-02,\n",
       "          -4.4180e-02, -4.2707e-02, -1.8383e-02,  1.2676e-02,  8.5104e-02,\n",
       "          -7.9586e-02,  2.5948e-02, -1.8067e-02, -4.2841e-02, -5.6359e-02,\n",
       "          -5.9487e-02,  2.3852e-02,  2.8990e-02,  1.9848e-02, -3.0808e-02,\n",
       "           6.2689e-02,  1.3925e-02,  5.5065e-02, -8.3953e-02,  4.9355e-02,\n",
       "          -9.9103e-02, -6.5038e-02, -5.5959e-02,  9.1337e-02,  2.8076e-02,\n",
       "          -9.5204e-02,  8.1554e-02, -2.9381e-02, -2.1505e-02, -6.8556e-02,\n",
       "           5.8417e-02, -4.0080e-02, -2.1737e-02,  9.9902e-02,  6.1287e-02,\n",
       "           5.7638e-02,  5.8584e-02,  2.9667e-02,  8.2525e-02, -6.2635e-02,\n",
       "          -8.5046e-02, -5.8883e-02,  3.5834e-02, -6.4859e-02, -7.2613e-03,\n",
       "           6.5371e-02, -4.7100e-02,  4.9120e-02, -8.0401e-02,  1.6904e-02,\n",
       "          -4.9039e-03,  8.7678e-03,  2.5243e-02,  1.0044e-02, -6.3682e-02,\n",
       "          -5.7936e-03, -4.3214e-02,  3.9307e-02, -1.6651e-02, -9.8383e-02,\n",
       "           6.5752e-02,  6.7168e-02, -6.9087e-02, -2.9103e-02, -9.0553e-02,\n",
       "           4.8626e-02, -5.6490e-03,  3.0154e-02,  9.2071e-02, -8.1360e-02,\n",
       "           3.8924e-02, -1.1200e-02, -3.0821e-02,  4.6971e-02,  1.0807e-03,\n",
       "          -1.2300e-02, -5.1049e-02,  8.4414e-02,  4.8138e-03,  8.8520e-02],\n",
       "         [ 1.7846e-02, -7.1514e-02, -5.9068e-02, -6.2896e-02,  1.9185e-03,\n",
       "          -4.3313e-03,  6.4460e-02,  4.3910e-02,  7.6325e-02,  1.1133e-02,\n",
       "          -1.7748e-02, -5.0591e-02, -2.4233e-02, -5.6824e-02,  6.2616e-03,\n",
       "          -8.3541e-02, -6.2707e-03, -1.6567e-02,  2.3395e-02, -5.3131e-02,\n",
       "          -9.0908e-02,  9.7513e-03,  7.7852e-02, -5.0156e-03,  7.5712e-02,\n",
       "           9.1538e-02, -1.0581e-02,  6.7276e-02,  7.2080e-02,  8.0862e-02,\n",
       "           6.8718e-02, -1.0377e-02, -5.2646e-02, -9.5053e-02, -1.1173e-02,\n",
       "          -9.8077e-02, -9.6939e-02, -8.7283e-02, -2.4225e-03, -7.5672e-03,\n",
       "          -8.3888e-02,  1.0004e-02, -3.1208e-02,  3.3289e-02, -7.7798e-02,\n",
       "          -2.3440e-02,  2.2584e-02, -1.6761e-02,  6.5078e-02,  1.8694e-02,\n",
       "          -6.4198e-02, -9.0515e-02, -1.1643e-03,  3.1365e-02,  6.9357e-02,\n",
       "           4.9985e-02,  3.4068e-02,  5.7878e-02,  6.1113e-02, -8.6062e-02,\n",
       "          -9.3121e-02,  6.7963e-02,  3.1421e-02,  1.2172e-02,  8.9021e-02,\n",
       "           8.5333e-02, -2.4176e-02, -4.1868e-02,  6.1841e-02, -5.3399e-03,\n",
       "           5.8953e-02,  4.6706e-02, -1.0893e-02,  5.8520e-02,  8.3034e-02,\n",
       "          -8.5216e-02, -4.2017e-02,  6.4855e-02, -2.3768e-02,  6.8319e-02,\n",
       "          -8.3326e-02, -6.3568e-02,  6.1711e-02,  1.4739e-03,  8.1964e-03,\n",
       "           6.0707e-02,  5.0151e-02,  5.2410e-02,  7.8499e-02,  8.5106e-02,\n",
       "           1.1139e-02, -8.0179e-02, -4.5649e-02, -8.2150e-02,  7.7081e-02,\n",
       "           6.8334e-02,  6.7449e-02,  1.6053e-02,  6.1019e-02, -4.5011e-02],\n",
       "         [-9.5535e-02, -5.4727e-02, -3.1733e-02, -2.1319e-02,  3.1123e-02,\n",
       "           5.5474e-02, -2.7282e-02,  9.3964e-02,  8.4857e-02, -9.3762e-02,\n",
       "          -5.2576e-02,  3.3751e-02,  1.3473e-02, -9.6156e-02, -6.4638e-02,\n",
       "          -4.6040e-03,  2.5019e-02, -3.4916e-02, -1.5883e-03,  5.0498e-03,\n",
       "           7.0464e-02, -7.3815e-02, -6.6674e-02, -5.5503e-02, -4.0153e-02,\n",
       "          -2.0695e-02,  8.0460e-02, -1.7759e-02,  2.7813e-02,  8.7274e-02,\n",
       "           6.7186e-02,  1.4212e-02, -4.4132e-02,  4.8728e-02, -6.2044e-02,\n",
       "           4.1899e-02,  5.0440e-02,  5.7337e-03,  5.6911e-02, -7.3314e-02,\n",
       "          -8.6062e-02, -3.8804e-02, -2.8734e-02, -2.6165e-02,  1.5449e-02,\n",
       "           7.2322e-02, -8.7735e-02,  8.2532e-02,  7.0483e-02, -7.8864e-02,\n",
       "          -9.6911e-02,  8.6635e-02,  5.3239e-02,  6.6749e-02, -6.7538e-02,\n",
       "          -4.0530e-02,  4.0530e-02,  7.3090e-02, -5.1688e-02,  7.9047e-03,\n",
       "          -6.1236e-02,  8.9401e-02,  3.3727e-02, -7.3146e-02, -6.5652e-02,\n",
       "          -7.7067e-02,  4.6420e-02,  4.7122e-02, -1.2481e-02,  3.1608e-02,\n",
       "          -5.4304e-02, -4.0355e-03,  9.4766e-02, -4.5835e-02,  6.4401e-02,\n",
       "          -6.6231e-02, -6.0507e-03, -8.4604e-02,  8.3740e-02,  2.9237e-02,\n",
       "           2.3473e-02, -7.3549e-02,  9.7461e-02, -2.1010e-02,  8.5319e-03,\n",
       "           3.0959e-02,  9.3193e-02, -2.9767e-02, -8.4936e-02,  3.9548e-02,\n",
       "           7.2172e-02,  7.0599e-02, -7.4611e-02, -2.3428e-02,  7.4394e-02,\n",
       "          -7.7651e-02,  4.0701e-02, -3.6367e-02, -3.9815e-02, -4.7879e-02],\n",
       "         [ 1.9275e-02,  6.5685e-02, -6.5695e-02,  8.5889e-02, -9.3496e-02,\n",
       "           1.3922e-02, -1.8383e-03, -8.2499e-03, -8.0395e-02, -6.1057e-02,\n",
       "          -9.7771e-02, -8.3623e-02,  2.5707e-03, -9.0735e-02,  5.3937e-02,\n",
       "          -9.4027e-02, -5.1781e-02, -8.5040e-02, -5.1454e-02,  3.3221e-02,\n",
       "           4.9889e-02, -7.8367e-02,  8.9843e-02, -4.8353e-02,  9.4633e-02,\n",
       "          -8.2707e-02, -8.4801e-02,  1.5488e-02, -7.0119e-02, -5.0093e-02,\n",
       "          -2.0358e-02, -6.2336e-03,  7.3669e-02,  7.9604e-03, -9.0884e-03,\n",
       "          -2.2793e-02,  1.2623e-02,  3.3463e-02,  6.7759e-02,  5.9103e-02,\n",
       "           3.9623e-02, -7.1277e-02, -6.0374e-02, -9.0054e-02,  7.7700e-02,\n",
       "           5.2360e-02,  4.9954e-03, -3.1070e-02, -5.5520e-02, -1.0141e-02,\n",
       "          -1.0139e-02,  4.5918e-02,  2.1805e-02, -1.8256e-02,  8.3852e-02,\n",
       "          -6.2316e-02, -3.9116e-02,  4.7420e-02, -1.2800e-02,  4.3562e-02,\n",
       "           7.4673e-02, -5.8152e-02, -9.7567e-02,  6.3381e-02, -3.6217e-03,\n",
       "           7.1319e-02, -3.6490e-02, -5.9629e-02, -8.0815e-02,  3.5538e-02,\n",
       "          -7.6705e-02, -3.7779e-02, -4.4045e-02,  1.0717e-03,  2.6015e-02,\n",
       "           7.1282e-02,  1.1840e-02,  9.5527e-02,  4.5801e-02,  3.4180e-02,\n",
       "           7.5950e-02,  6.3478e-02, -6.7875e-02, -9.7727e-02, -4.7882e-03,\n",
       "           5.1902e-02, -2.5550e-02,  6.9682e-02,  2.8580e-02, -5.5470e-02,\n",
       "           9.9020e-02, -4.9208e-02,  8.1764e-02,  7.9116e-02,  8.1334e-03,\n",
       "           8.2348e-02,  9.0152e-06, -9.8829e-02, -7.4940e-03,  9.9455e-02],\n",
       "         [ 6.4098e-02,  2.2094e-02, -5.8208e-03, -9.9941e-02,  8.6646e-02,\n",
       "           9.7601e-02,  4.9342e-04, -8.6386e-02, -2.1654e-02,  1.1408e-02,\n",
       "          -3.2891e-02,  3.6655e-02, -1.6805e-02, -6.7499e-02,  9.5374e-02,\n",
       "          -9.5450e-02, -2.1845e-02,  7.8836e-02, -5.5592e-02,  7.8097e-02,\n",
       "          -9.4771e-02,  4.2300e-02, -8.0871e-02,  1.3394e-02, -5.8403e-02,\n",
       "          -1.2716e-02,  4.3497e-02,  2.0570e-02, -4.8445e-02, -1.4207e-02,\n",
       "          -1.9212e-02, -5.2036e-02,  8.6149e-03, -1.8702e-02,  9.4540e-02,\n",
       "          -2.2532e-02, -3.7818e-02,  3.9299e-02,  1.5986e-02,  7.4047e-02,\n",
       "          -5.6488e-03,  2.2186e-02,  6.2724e-02,  7.1887e-03,  7.3183e-02,\n",
       "           1.5584e-02, -7.7088e-02,  4.8007e-02, -8.9995e-02, -4.1654e-02,\n",
       "           9.4196e-03, -1.5354e-02,  5.8549e-02, -8.5755e-02,  5.7635e-02,\n",
       "           6.8145e-02, -8.0880e-02, -9.2360e-04, -2.7373e-02, -1.4056e-02,\n",
       "          -7.5935e-02, -9.3995e-02, -5.4446e-02, -5.1042e-02, -2.6836e-02,\n",
       "           3.5293e-02, -1.2931e-02, -4.8287e-02,  6.6916e-02,  2.1860e-02,\n",
       "           8.7918e-02,  6.8832e-02, -2.6080e-02, -7.6691e-02, -9.9615e-02,\n",
       "           7.8463e-02, -5.6888e-02, -2.3560e-02, -6.4187e-03,  8.7804e-02,\n",
       "           1.7319e-02,  5.6289e-02,  2.8257e-02, -8.6446e-02, -3.5838e-03,\n",
       "           1.9988e-02,  2.6275e-02, -6.8376e-02, -3.7671e-03,  1.8141e-02,\n",
       "           8.5448e-02, -9.3275e-02,  9.6462e-02, -9.2593e-02,  7.8389e-02,\n",
       "           6.0332e-03,  8.6617e-02, -6.8832e-02,  3.0902e-02, -5.7039e-02],\n",
       "         [-8.6646e-02, -5.9055e-02, -6.4042e-03, -9.3107e-02, -8.6566e-02,\n",
       "           9.0252e-02,  1.1794e-02, -3.0798e-03,  7.4971e-03,  2.0283e-02,\n",
       "          -7.3520e-02, -5.1222e-02, -4.1333e-02, -6.3659e-02,  5.4293e-02,\n",
       "           7.4210e-02,  9.4083e-02,  8.6777e-04,  3.0498e-02, -8.1835e-03,\n",
       "           7.2815e-02, -6.4560e-02,  4.0501e-02,  9.4016e-02, -8.9814e-02,\n",
       "           3.2659e-02, -2.3273e-02,  7.9742e-02, -8.3952e-03,  9.8038e-02,\n",
       "           1.9262e-02, -3.7488e-02, -2.2767e-02,  5.8898e-02,  7.0703e-02,\n",
       "          -8.3011e-02,  9.4926e-02, -5.5376e-02, -4.8449e-02,  8.4910e-02,\n",
       "           1.1341e-02, -1.7869e-02,  1.5642e-02,  1.9180e-03,  8.9204e-02,\n",
       "          -1.2261e-02, -9.6132e-02, -1.6876e-03,  7.5593e-02, -2.6155e-02,\n",
       "          -3.6588e-02, -7.0747e-02,  7.8326e-02,  7.9865e-02, -1.9121e-03,\n",
       "           4.3987e-02, -8.1004e-02,  6.4827e-02, -7.8487e-02, -3.9412e-02,\n",
       "           2.9884e-02, -7.2165e-02, -9.9444e-02, -5.2231e-02,  8.7741e-02,\n",
       "           3.8823e-02, -5.2001e-02, -3.3610e-02,  9.4360e-02,  9.8073e-02,\n",
       "           3.6109e-02, -5.1101e-02,  5.9513e-03,  2.3856e-02, -5.2256e-02,\n",
       "           8.0710e-03,  2.8664e-02,  5.2087e-02, -4.7990e-03, -6.0029e-02,\n",
       "          -4.2661e-02, -6.2361e-02,  9.9978e-03,  9.1728e-02, -3.7230e-02,\n",
       "          -1.1758e-02,  3.8696e-03,  9.7868e-03, -1.2781e-02, -8.8340e-02,\n",
       "          -3.5979e-02,  3.8983e-02,  5.0206e-02,  2.4018e-02,  8.5457e-02,\n",
       "           4.8707e-02,  6.7998e-02,  1.4241e-02, -4.4886e-02, -7.5748e-02],\n",
       "         [-2.7074e-03,  1.8622e-02, -4.0290e-02, -3.5921e-03, -7.6882e-02,\n",
       "           5.1162e-02,  8.6970e-02, -2.8830e-02, -6.1755e-02, -3.7623e-02,\n",
       "          -1.6884e-02,  6.4517e-02,  6.3640e-02, -4.2471e-02,  6.5762e-02,\n",
       "          -9.8150e-02, -9.2465e-02, -6.9353e-02,  7.1811e-02,  5.5087e-02,\n",
       "           6.4841e-02,  8.6864e-02,  8.1670e-02,  6.5838e-02,  3.2595e-02,\n",
       "          -8.3762e-02,  3.0900e-02,  9.2350e-02, -8.3609e-02, -5.9901e-02,\n",
       "          -1.5178e-02, -9.5324e-02, -3.3966e-02,  4.2359e-02, -5.8469e-02,\n",
       "           8.6882e-02,  2.5090e-02, -1.6922e-03, -6.7350e-02,  2.4701e-02,\n",
       "          -2.2313e-02,  8.5243e-02,  2.4586e-02, -7.6920e-02, -5.7894e-02,\n",
       "          -1.2455e-02,  9.0009e-02,  4.9226e-02,  7.8454e-02, -2.4550e-02,\n",
       "           8.1261e-02, -4.3042e-02,  8.3394e-02,  1.9180e-02, -4.2991e-02,\n",
       "           1.4408e-02,  1.7451e-03, -2.7528e-02, -1.4597e-02, -6.3780e-03,\n",
       "          -9.4292e-02, -4.3848e-03, -5.6519e-03,  6.9653e-02,  8.8657e-02,\n",
       "          -7.9117e-02,  3.8525e-02,  7.6731e-02,  5.0346e-02,  7.8327e-02,\n",
       "           3.4114e-03, -5.2358e-02,  6.9316e-02,  7.1718e-02,  2.6515e-02,\n",
       "           3.7442e-02,  1.2846e-02, -5.3417e-02, -2.5356e-02, -6.1307e-02,\n",
       "          -3.3690e-02, -4.3438e-02, -5.6795e-02,  6.6328e-02,  7.9796e-02,\n",
       "          -7.4078e-02,  2.5307e-02,  9.1254e-02, -6.1078e-02, -7.8728e-02,\n",
       "           4.5639e-02,  7.5659e-02,  8.8816e-02,  4.8566e-02,  4.2067e-02,\n",
       "           7.6078e-02, -2.6105e-02,  1.3300e-02, -8.3382e-02,  9.5685e-03],\n",
       "         [-2.2189e-02, -9.9900e-02, -4.1544e-02,  5.9023e-02, -4.1024e-02,\n",
       "           3.5367e-02,  8.3452e-02,  2.0742e-02,  6.6297e-02,  9.2877e-02,\n",
       "           2.3906e-02, -7.5155e-02, -5.4149e-02,  5.2232e-03, -7.8152e-02,\n",
       "          -3.4469e-02, -4.2857e-02,  7.9091e-02,  3.1926e-03, -5.7585e-03,\n",
       "          -6.8308e-02, -6.7447e-02,  1.3991e-02, -1.1324e-02,  8.2946e-02,\n",
       "           1.2047e-02, -4.3078e-02,  1.2365e-02,  3.0246e-02, -8.7035e-02,\n",
       "           8.9128e-02, -9.4082e-02,  1.2694e-02,  3.7024e-02, -1.2731e-02,\n",
       "          -4.5879e-02,  3.1634e-03, -8.0317e-02,  9.4948e-02, -5.7538e-02,\n",
       "           2.1601e-02,  5.1637e-02,  2.1347e-02,  8.8179e-02, -4.0480e-02,\n",
       "          -4.6632e-02, -6.5562e-03,  2.5222e-02, -6.0077e-02,  2.1389e-02,\n",
       "           4.4000e-02,  7.6788e-02, -4.6199e-02, -4.5321e-02,  2.7665e-02,\n",
       "           9.3810e-02,  9.6513e-02, -4.4488e-02,  8.8840e-02,  5.4068e-02,\n",
       "          -1.9848e-02, -4.1465e-02, -8.5998e-03,  5.3543e-02,  2.9940e-02,\n",
       "           9.8612e-02,  1.7417e-02, -1.5597e-03, -8.6319e-02, -8.9204e-02,\n",
       "          -1.0172e-02,  2.2731e-02, -2.9794e-02,  9.3697e-02,  2.7370e-02,\n",
       "          -7.4861e-02,  2.1103e-02, -5.1737e-03, -3.8437e-02,  5.3144e-02,\n",
       "          -7.9621e-02,  8.9109e-02, -7.4197e-03,  5.4003e-02, -1.8417e-02,\n",
       "          -2.3849e-02,  5.8113e-02, -1.1537e-02,  7.8973e-02,  8.7994e-02,\n",
       "           6.7556e-04,  5.9483e-03, -9.0594e-03, -8.0752e-02, -5.6190e-02,\n",
       "           1.9529e-02, -9.7028e-02,  2.3182e-02,  9.0092e-02, -6.3865e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0945,  0.0522, -0.0955, -0.0980, -0.0990,  0.0941, -0.0797, -0.0022,\n",
       "         -0.0827,  0.0632], requires_grad=True)]"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 46
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.587408Z",
     "start_time": "2025-02-25T15:45:42.583608Z"
    }
   },
   "source": [
    "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
   ],
   "outputs": [],
   "execution_count": 47
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.650302Z",
     "start_time": "2025-02-25T15:45:42.645779Z"
    }
   },
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package,随机梯度下降\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ],
   "outputs": [],
   "execution_count": 48
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.755974Z",
     "start_time": "2025-02-25T15:45:42.667609Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad() # 装饰器，禁止反向传播，节省内存\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = [] # 记录损失\n",
    "    pred_list = [] # 记录预测\n",
    "    label_list = [] # 记录标签\n",
    "    for datas, labels in dataloader:#10000/32=312\n",
    "        datas = datas.to(device) # 转到GPU\n",
    "        labels = labels.to(device) # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item()) # 记录损失\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 49
  },
  {
   "cell_type": "code",
   "source": [
    "1875*20"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:45:42.763589Z",
     "start_time": "2025-02-25T15:45:42.756980Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37500"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 50
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:52:07.459944Z",
     "start_time": "2025-02-25T15:45:42.765662Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch): # 训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
    "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1) # 训练集预测\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval() # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train() # 进入训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1 # 全局步数加1\n",
    "                pbar.update(1) # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 20 #改为40\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "bd5912403eda42e899e847f80e679f02"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 51
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"train\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:52:07.469322Z",
     "start_time": "2025-02-25T15:52:07.461943Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.49183037877082825, 'acc': 0.78125, 'step': 37495},\n",
       " {'loss': 0.20155854523181915, 'acc': 0.9375, 'step': 37496},\n",
       " {'loss': 0.5808051228523254, 'acc': 0.78125, 'step': 37497},\n",
       " {'loss': 0.49665606021881104, 'acc': 0.84375, 'step': 37498},\n",
       " {'loss': 0.3061177432537079, 'acc': 0.875, 'step': 37499}]"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 52
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"val\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T15:52:07.479577Z",
     "start_time": "2025-02-25T15:52:07.470322Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.37045203987211467, 'acc': 0.8693, 'step': 33000},\n",
       " {'loss': 0.3881460871107091, 'acc': 0.8623, 'step': 34000},\n",
       " {'loss': 0.35886208273875064, 'acc': 0.8714, 'step': 35000},\n",
       " {'loss': 0.36083285412944544, 'acc': 0.8684, 'step': 36000},\n",
       " {'loss': 0.3665624758639275, 'acc': 0.8704, 'step': 37000}]"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 53
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:52:07.884293Z",
     "start_time": "2025-02-25T15:52:07.482811Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1] # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid() # 显示网格\n",
    "        axs[idx].legend() # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.06250\n",
      "1000     0.71875\n",
      "2000     0.78125\n",
      "3000     0.75000\n",
      "4000     0.71875\n",
      "5000     0.87500\n",
      "6000     0.90625\n",
      "7000     0.93750\n",
      "8000     0.84375\n",
      "9000     0.75000\n",
      "10000    0.81250\n",
      "11000    0.87500\n",
      "12000    0.87500\n",
      "13000    0.71875\n",
      "14000    0.84375\n",
      "15000    0.96875\n",
      "16000    0.90625\n",
      "17000    0.75000\n",
      "18000    0.96875\n",
      "19000    0.81250\n",
      "20000    0.84375\n",
      "21000    0.87500\n",
      "22000    0.87500\n",
      "23000    0.75000\n",
      "24000    0.90625\n",
      "25000    0.90625\n",
      "26000    0.84375\n",
      "27000    0.93750\n",
      "28000    0.87500\n",
      "29000    0.87500\n",
      "30000    0.81250\n",
      "31000    0.90625\n",
      "32000    1.00000\n",
      "33000    0.96875\n",
      "34000    0.87500\n",
      "35000    0.75000\n",
      "36000    0.93750\n",
      "37000    0.93750\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.0472\n",
      "1000     0.6958\n",
      "2000     0.7684\n",
      "3000     0.7911\n",
      "4000     0.8036\n",
      "5000     0.8220\n",
      "6000     0.8227\n",
      "7000     0.8299\n",
      "8000     0.8150\n",
      "9000     0.8384\n",
      "10000    0.8252\n",
      "11000    0.8400\n",
      "12000    0.8421\n",
      "13000    0.8458\n",
      "14000    0.8488\n",
      "15000    0.8481\n",
      "16000    0.8510\n",
      "17000    0.8493\n",
      "18000    0.8420\n",
      "19000    0.8569\n",
      "20000    0.8573\n",
      "21000    0.8585\n",
      "22000    0.8610\n",
      "23000    0.8623\n",
      "24000    0.8556\n",
      "25000    0.8663\n",
      "26000    0.8652\n",
      "27000    0.8584\n",
      "28000    0.8597\n",
      "29000    0.8654\n",
      "30000    0.8685\n",
      "31000    0.8720\n",
      "32000    0.8708\n",
      "33000    0.8693\n",
      "34000    0.8623\n",
      "35000    0.8714\n",
      "36000    0.8684\n",
      "37000    0.8704\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 54
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T15:52:09.775917Z",
     "start_time": "2025-02-25T15:52:07.886292Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "model.eval() # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3495\n",
      "accuracy: 0.8751\n"
     ]
    }
   ],
   "execution_count": 55
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
